package com.vavr.checkincms.common.util;

import java.nio.charset.StandardCharsets;
import java.security.SecureRandom;

import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;

import lombok.extern.slf4j.Slf4j;
import org.apache.commons.codec.binary.Hex;

/**
 * HmacSHAEncoderUtils
 *
 * @since 2.0.0
 */
@Slf4j
public class HmacSHAEncoderUtils {
    /**
     * 密钥长度（字节）
     */
    private static final int KEY_LENGTH = 32; // 256-bit 密钥

    private HmacSHAEncoderUtils() {
    }

    /**
     * 生成指定长度的随机字节数组，并将其转换为 16 进制字符串
     *
     * @param length 字节长度
     * @return 16 进制字符串
     */
    public static String generateHexString(int length) {
        SecureRandom secureRandom = new SecureRandom();
        byte[] keyBytes = new byte[length];
        secureRandom.nextBytes(keyBytes);
        return Hex.encodeHexString(keyBytes).toUpperCase();
    }

    /**
     * 生成一个 256-bit（32 字节）长度的 16 进制字符串
     *
     * @return 16 进制字符串
     */
    public static String generateSecurityKey() {
        return generateHexString(KEY_LENGTH);
    }

    /**
     * 生成签名
     *
     * @param data 参与签名的数据
     * @param securityKey 秘钥
     * @return 签名字符串
     */
    public static String generateSignature(String data, String securityKey) {
        try {
            Mac mac = Mac.getInstance("HmacSHA256");
            SecretKeySpec secretKeySpec = new SecretKeySpec(securityKey.getBytes(StandardCharsets.UTF_8), "HmacSHA256");
            mac.init(secretKeySpec);
            byte[] rawHmac = mac.doFinal(data.getBytes(StandardCharsets.UTF_8));
            return Hex.encodeHexString(rawHmac);
        }
        catch (Exception e) {
            log.error("生成签名异常。", e);
        }
        return "";
    }
}
